import os
import shutil
import logging

class DirectoryCleaner:
    """
    一个安全删除指定目录下所有文件和文件夹的类
    """
    
    def __init__(self, target_dir, keep_root=False):
        """
        初始化清理器
        :param target_dir: 要清理的目标目录路径
        :param keep_root: 是否保留根目录，True表示保留
        """
        self.target_dir = target_dir
        self.keep_root = keep_root
        self.logger = self._setup_logger()
    
    def _setup_logger(self):
        """
        设置日志记录器
        """
        logger = logging.getLogger(__name__)
        logger.setLevel(logging.INFO)
        
        # 创建控制台处理器
        ch = logging.StreamHandler()
        ch.setLevel(logging.INFO)
        
        # 创建格式化器
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        ch.setFormatter(formatter)
        
        # 添加处理器到日志记录器
        logger.addHandler(ch)
        
        return logger
    
    def clean(self):
        """
        执行清理操作
        """
        try:
            if not os.path.exists(self.target_dir):
                self.logger.warning(f"目标目录 {self.target_dir} 不存在")
                return False
            
            self.logger.info(f"开始清理目录: {self.target_dir}")
            
            # 根据参数决定是否保留根目录
            if self.keep_root:
                for item in os.listdir(self.target_dir):
                    item_path = os.path.join(self.target_dir, item)
                    if os.path.isfile(item_path):
                        try:
                            os.unlink(item_path)
                        except Exception as e:
                            self.logger.warning(f"跳过无法删除的文件 {item_path}: {str(e)}")
                    elif os.path.isdir(item_path):
                        try:
                            shutil.rmtree(item_path)
                        except Exception as e:
                            self.logger.warning(f"跳过无法删除的目录 {item_path}: {str(e)}")
                self.logger.info(f"成功清理目录内容: {self.target_dir}")
            else:
                try:
                    shutil.rmtree(self.target_dir)
                    self.logger.info(f"成功清理目录: {self.target_dir}")
                except Exception as e:
                    self.logger.warning(f"跳过无法删除的目录 {self.target_dir}: {str(e)}")
                    return False
            return True
            
        except Exception as e:
            self.logger.error(f"清理目录 {self.target_dir} 时出错: {str(e)}")
            return False


if __name__ == "__main__":
    # 使用示例
    pathArr  = [r"C:\Users\tianming.fan\AppData\Local\Temp",
     r"C:\Windows\Temp",
     r"C:\ProgramData\Package Cache",
     r"C:\Users\Administrator\AppData\Local\Temp"]
    # 循环路径
    for target in pathArr:
      # 创建清理器实例，保留根目录
      cleaner = DirectoryCleaner(target,True)
      cleaner.clean()